#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

#include "LinkedStack.h"

/**
***********************************************************************
* @brief   初始化栈
* @param   LinkedStack *stack：整个链表指针（整个栈指针）
* @retval  无
* @note  
***********************************************************************
*/
void initStack(LinkedStack *stack)
{
	stack->head = NULL;//初始化单向链表头部指针为空（栈为空）
	stack->length = 0;//初始化单向链表长度为0（栈中无内容）
}

/**
***********************************************************************
* @brief   释放栈内存
* @param   LinkedStack *stack：整个链表指针（整个栈指针）
* @retval  
* @note  
***********************************************************************
*/
int destroyStack(LinkedStack *stack)
{
	/*判断链表是否为空（栈是否为空）*/
	if(stack->length == 0)//if(stack->head == NULL)
	{
		printf("链表为空（栈为空），没有内存可以释放");
		return -1;
	}

	Stack *currentStack = stack->head;//定义个需要释放内存的节点
	/*遍历整个链表（遍历整个栈）*/
	for(int i = 0; i < stack->length; i++)
	{
		Stack *tempStack = currentStack;//定义一个临时节点存放释放内存的节点
		currentStack = currentStack->next;//找到下一个节点，并赋值给currentStack
		free(tempStack);//释放当前节点的内存
	}
	// while(stack-length--)
	// {
	// 	Stack *tempStack = currentStack;
	// 	currentStack = currentStack->next;
	// 	free(tempStack);
	// }
	stack->head = NULL;//头节点指针设置为空
	stack->length = 0;//链表（栈）长度设置为0
	return 1;
}

/**
***********************************************************************
* @brief   栈内元素的个数
* @param   const LinkedStack *stack：整个栈指针
* @retval  返回栈中元素的个数
* @note  
***********************************************************************
*/
size_t getLength(const LinkedStack *stack)
{
	return stack->length;
}

/**
***********************************************************************
* @brief   元素进栈（入栈）
* @param   LinkedStack *stack, int element
* @retval  无·
* @note  
***********************************************************************
*/
int push(LinkedStack *stack, int element)
{
	Stack *stackNode = (Stack*)malloc(sizeof(Stack) * 1);//申请存放新插入元素的内存空间
	/*判断内存是否申请成功*/
	if(stackNode == NULL)
	{
		printf("内存申请失败\n");
		return -1;
	}
	printf("内存申请成功\n");
	stackNode->data = element;//内存申请成功之后将新节点赋入新值

	/*在链表头部插入元素*/
	stackNode->next = stack->head;//将新插入的节点指向该节点的下一个节点地址
	stack->head = stackNode;//再将头节点指向新插入节点的地址stackNode

	stack->length ++;//链表（栈长度累增）
	return 1;
}

/**
***********************************************************************
* @brief   元素出栈（只能从栈顶依次弹栈--先进后出，后进先出）
* @param   LinkedStack *stack
* @retval  返回出栈元素
* @note  
***********************************************************************
*/
int pop(LinkedStack *stack)
{
	Stack *popStackNode = stack->head;
	stack->head = popStackNode->next;

	int popStackData = popStackNode->data;//将出栈的数据赋值在popStackData
	free(popStackNode);//释放内存
	stack->length--;//链表（栈）长度递减
	return popStackData;//返回出栈的元素
}

/**
***********************************************************************
* @brief   遍历链表（栈）中的元素
* @param   LinkedStack *stack
* @retval  无
* @note  
***********************************************************************
*/
void printStack(LinkedStack *stack)
{
	Stack *currentStack = stack->head;
	for(int i = 0; i < stack->length; i++)
	{
		// Stack *tempStack = currentStack;
		// currentStack = currentStack->next;
		// return tempStack->data;
		int stackData = currentStack->data;//将节点中的数据存放在stackData中
		currentStack = currentStack->next;//将currentStack地址更新到下一个节点的地址
		printf("%d\n", stackData);
	}
}